home *** CD-ROM | disk | FTP | other *** search
/ Stone Design / Stone Design.iso / Stone_Friends / Wave / WavesWorld / Source / IBPalettes / WW3DKit / vcnoise.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-03-22  |  1.2 KB  |  68 lines

  1. #include "proctext.h"
  2. #include "noise.h"
  3.  
  4. static float valueTab[TABSIZE];
  5.  
  6. static void valueTabInit(int seed);
  7. static float vlattice(int ix, int iy, int iz);
  8.  
  9. float
  10. vcnoise(float x, float y, float z)
  11. {
  12.     int ix, iy, iz;
  13.     int i, j, k;
  14.     float fx, fy, fz;
  15.     float dx, dy, dz;
  16.     float sum = 0;
  17.     static int initialized = 0;
  18.  
  19.     if (!initialized) {
  20.         valueTabInit(665);
  21.         initialized = 1;
  22.     }
  23.  
  24.     ix = FLOOR(x);
  25.     fx = x - ix;
  26.  
  27.     iy = FLOOR(y);
  28.     fy = y - iy;
  29.  
  30.     iz = FLOOR(z);
  31.     fz = z - iz;
  32.  
  33.     for (k = -1; k <= 2; k++) {
  34.         dz = k - fz;
  35.         dz = dz*dz;
  36.         for (j = -1; j <= 2; j++) {
  37.             dy = j - fy;
  38.             dy = dy*dy;
  39.             for (i = -1; i <= 2; i++){
  40.                 dx = i - fx;
  41.                 dx = dx*dx;
  42.                 sum += vlattice(ix+i,iy+j,iz+k)
  43.                     * catrom2(dx + dy + dz);
  44.             }
  45.         }
  46.     }
  47.     return sum;
  48. }
  49.  
  50. static void
  51. valueTabInit(int seed)
  52. {
  53.     float *table = valueTab;
  54.     int i;
  55.     extern long random();
  56.     extern long srandom();
  57.  
  58.     srandom(seed);
  59.     for(i = 0; i < TABSIZE; i++)
  60.         *table++ = 1. - 2.*RANDNBR;
  61. }
  62.  
  63. static float
  64. vlattice(int ix, int iy, int iz)
  65. {
  66.     return valueTab[INDEX(ix,iy,iz)];
  67. }
  68.